package itheima03;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/*
    反射获取构造方法
    步骤:
        1.获取Class类型的对象(三种方式,建议使用第三种forName)
        2.通过Class类型的对象获取构造方法对象
            java.lang.Class类 成员方法
            (1) public Constructor[] getConstructors(): 获取public修饰的所有的构造方法
                每个构造方法被封装成了一个Constructor类型的对象,被存储数组中
                注意: Constructor类,专门用来描述构造方法的
            (2)public Constructor<T> getConstructor(Class... parameterTypes): 获取指定参数类型的public修饰的构造方法
                如果不存在对应的构造方法，则会抛出 java.lang.NoSuchMethodException 异常。
                参数:
                    Class... parameterTypes: 必须传递数据类型对应的Class对象,而且是可变参数,可以传递数组,参数列表,不传递(获取空参)

                    比如: 获取 构造方法 public Person(String name, int age) { ...} 对应的Construtor对象

                    参数列表:  String.class,int.class

        3.练习
            获取public修饰的空参构造方法对象
            获取public修饰的第一个参数是String类型,第二个参数是int类型的构造方法对象
            获取public修饰的参数是是int类型的构造方法对象


 */
public class Demo04GetConstructor {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {

        Class<?> c = Class.forName("domain.Person");

        //1.获取public修饰的所有的构造方法
        Constructor<?>[] cons = c.getConstructors();
        //遍历
        for (Constructor<?> con : cons) {
            System.out.println(con);
        }
        System.out.println("---------");
        //2.获取public修饰的空参构造方法对象
        Constructor<?> con = c.getConstructor();
        System.out.println(con);

        //3.获取public修饰的第一个参数是String类型,第二个参数是int类型的构造方法对象
        Constructor<?> con2 = c.getConstructor(String.class, int.class);
        System.out.println(con2);

        //4.获取public修饰的参数是int类型的构造方法对象
        Constructor<?> con3 = c.getConstructor(int.class);
        System.out.println(con3);


        System.out.println("--------------");
        //public java.lang.String domain.Person.toString()
        Method m1 = c.getMethod("toString");
        System.out.println(m1);
        //获取get方法和set方法
        Method setName = c.getMethod("setName", String.class);
        System.out.println(setName);
        //public char[] domain.Person.my2CharArray(java.lang.String)
        Method my2CharArray = c.getMethod("my2CharArray", String.class);
        System.out.println(my2CharArray);
    }
}


/*
public class Demo04GetConstructor {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        Class<?> c=Class.forName("domain.Person");
        Constructor<?>[] constructors = c.getConstructors();
        //public domain.Person(int)
        //public domain.Person(java.lang.String,int)
        //public domain.Person()
        //public domain.Person(java.lang.String)
        //获取public修饰的所有的构造方法
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }
        System.out.println("-------------");
        //获取空参构造
        Constructor<?> con = c.getConstructor();
        System.out.println(con);
       //参数顺序不一致报错
       //Constructor<?> constructor=c.getConstructor(int.class,String.class);
       //System.out.println(constructor);

        //3.获取public修饰的第一个参数是String类型,第二个参数是int类型的构造方法对象
        Constructor<?>constructor=c.getConstructor(String.class,int.class);
        System.out.println(constructor);

        //4.获取public修饰的参数是int类型的构造方法对象
        //public domain.Person(int)
        Constructor<?> constructor1=c.getConstructor(int.class);
        System.out.println(constructor1);

        System.out.println("--------------");
         //public java.lang.String domain.Person.toString()
         Method m1 = c.getMethod("toString");
         System.out.println(m1);
        //获取get方法和set方法
        Method setName = c.getMethod("setName", String.class);
        System.out.println(setName);
        //public char[] domain.Person.my2CharArray(java.lang.String)
        Method my2CharArray = c.getMethod("my2CharArray", String.class);
        System.out.println(my2CharArray);
    }
}*/
